/**
 * 泛型的类型变量可以有多个,并且类型变量之间还可以约束(比如,第二个类型变量受第一个类型变量约束)
 */

// Key是Type中所有属性的其中一个
function getProp<Type, Key extends keyof Type>(obj:Type, key:Key) {
    return obj[key]
}

let person = {
    name: 'tom',
    age: 19
}
getProp(person, 'name')
getProp(person, 'age')

// 解释
// 1.添加了第二个类型变量Key,两个类型变量之间使用(,)分隔
// 2.keyof关键字接收一个对象类型,生成其键名称(可能是字符串或数字)的联合类型
// 3.本示例中 keyof Type 实际上获取的是person对象所有键的联合类型,也就是: 'name' | 'age'
// 4.类型变量Key受Type约束,可以理解为: Key只能是Type所有键中的任意一个,或者说只能访问对象中存在的属性









// getProp(person, 'age111')//必须是person中存在的任何一个

//补充
// getProp(18,xx) 后面可以是number类型的一些方法
// getProp(obj: number, 
//     key: "toString" | "toFixed" | "toExponential" | "toPrecision" | "valueOf" | "toLocaleString"
// ):


// getProp('abc',xx) 后面可以是string类型的一些方法
getProp('abc',1) // 此处 1 表示索引
// key: number | 
// typeof Symbol.iterator | "toString" | "charAt" | "charCodeAt" | "concat" | "indexOf" | "lastIndexOf" | "localeCompare" | "match" | "replace" | "search" | "slice" | ... 35 more ... | "matchAll")
 